\section{Introdução}

Um dos modelos de programação paralela existentes é o modelo de programação em memória partilhada. Neste modelo, os processos/\emph{threads} acedem a um espaço global de endereços, onde este poderá estar mapeado numa mesma máquina onde os \emph{threads} acedem à mesma memória física, ou pode ser simulado através de uma camada de software (\emph{middleware}/\emph{runtime}) que oferece um modelo de programação em memória partilhada ao programador sobre arquitecturas de memória distribuída, como um \emph{cluster}. 

A simulação de memória partilhada (logicamente partilhada) sobre uma arquitectura de memória distribuída (memória fisicamente distribuída) tem as vantagens inerentes do modelo de programação em memória partilhada, mas o ambiente de suporte ao modelo terá que lidar com a consistência dos valores das variáveis presentes no espaço global de endereços, tendo para isso que implementar um modelo de consistência. Existem dois modelos de consistência:
\begin{inparaenum}[1)]
\item Modelo de consistência fraca;
\item Modelo de consistência forte.
\end{inparaenum}

O objectivo deste trabalho foi a construção de uma camada de \emph{software} que simula memória partilhada em arquitecturas de memória distribuída, onde o suporte oferece uma \emph{API} com primitivas para aceder (ler/escrever) a apenas uma variável presente no estado global de endereços, mas em que esta internamente está replicada pelas várias máquinas da arquitectura. 
Desta forma, foi necessário implementar um modelo de consistência para garantir a coerência do seu valor, quando este for alterado pelos processos clientes concorrentes presentes na computação. O modelo de consistência implementado foi o modelo de consistência fraca onde se recorre à implementação do algoritmo \emph{Herman-Verjus}, de 1979, utilizando relógios lógicos para garantir a ordenação das actualizações da variável, para que as cópias da variável possam convergir para o mesmo valor ao longo do tempo.

Para a implementação do suporte recorremos uma vez mais à biblioteca de troca de mensagens \emph{MPI} \cite{mpi}, onde a troca de mensagens é necessária na interacção cliente-servidor para o cliente ler e modificar a variável e para a interacção entre servidores para que estes tratem das actualizações do valor da variável pela mesma ordem.